import cv2
import numpy as np
import pandas as pd
# 封装环境
def muti_detect(eyes_img_path):
    '''
        input:
            eyes_img_path：眼镜图片路径
        output:
            （x_ori, y_ori, x_bound, y_bound）
    '''
    # img_path1 = r"C:\Users\Admin\Desktop\CV\detect\img\humen_face.png"
    img_path1 = eyes_img_path # 该参数在人脸上测试成功
    #
    # mojing_path = r"C:\Users\Admin\Desktop\CV\detect\img\cl.png"

    #载入带有人脸的图片
    img = cv2.imread(img_path1)
    # mojing = cv2.imread(mojing_path)

    #将彩色图片转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # mojing_gray = cv2.cvtColor(mojing,cv2.COLOR_BGR2GRAY)

    #载入人脸检测的Cascade模型
    # face_cascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('./haar/haarcascade_eye.xml')
    if eye_cascade.empty():
    # if face_cascade.empty() or eye_cascade.empty():
        print('--(!)Error loading face cascade')

    # 检测画面中的人脸
    result_detect = eye_cascade.detectMultiScale(
        gray,           # 输入灰度图（必须，级联分类器要求单通道）
        scaleFactor=1.1, # 缩放因子（默认1.1）
        minNeighbors=3,  # 最小邻域数（默认3）
        flags=0,         # 旧版本兼容参数（现在基本不用）
        minSize=(50,50),    # 目标最小尺寸（(w,h)，默认None表示不限制）
        maxSize=None     # 目标最大尺寸（(w,h)，默认None表示不限制）
    )

    #遍历返回的face数组(里面没有置信度分数)（只有原点会宽高）
    count = 0
    df_detect = pd.DataFrame(result_detect,columns=['x','y','w','h'])
    # 令索引
    print(df_detect)
    x_ori = df_detect.iloc[0]['x']
    y_ori = df_detect.iloc[0]['y']
    y_bound = df_detect.iloc[1]['y']+df_detect.iloc[1]['h']
    x_bound = df_detect.iloc[1]['x']+df_detect.iloc[1]['w']
    # 在画面中画矩形
    for eyes in result_detect:
        #获取眼的坐标
        x,y,w,h = eyes
        #在画面中画矩形
        cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
        cv2.rectangle(img, (x_ori,y_ori), (x_bound,y_bound), (255,0,0), 2)

    # cvADD
    #创建一个窗口 名字叫做Face
    cv2.namedWindow("eyes")
    #在窗口Face上面展示图片img
    cv2.imshow("eyes", img)
    #等待任意按键按下
    cv2.waitKey(0)
    print("x_ori,y_ori,y_bound,x_bound,eyes_img_path:",
        x_ori,y_ori,y_bound,x_bound,eyes_img_path)
    return x_ori,y_ori,y_bound,x_bound,eyes_img_path
if __name__ == "__main__":
    # zb = muti_detect(r'C:\Users\Admin\Desktop\CV\detect\eyes.jpg')
    # 测试环境
    img1 = cv2.imread(r'C:\Users\Admin\Desktop\CV\detect\eyes.jpg')
    img2 = cv2.imread(r'C:\Users\Admin\Desktop\CV\detect\img\cl.png')
    img3 = img1.copy()
    # 合适的边界
    # low_bound = 150 # 下边界
    # up_bound = 79 # 上边界
    # right_bound = 235 # 右边界
    # left_bound =  81 # 左边界
    # img2 = cv2.resize(img2,(width,length))
    # 微调后的图片大小：
    # img3[up_bound:low_bound,left_bound:right_bound,:] = img2[:,:,:]

    # 不协调的边界
    low_bound = 215 # 下边界
    up_bound = 110 # 上边界
    right_bound = 171 # 右边界
    left_bound =  79 # 左边界
    length = low_bound - up_bound
    width = right_bound - left_bound
    # 图片大小：
    # 画框原点：
    img2 = cv2.resize(img2,(length,width))
    print('微调后的图片大小(chang, kuan, channl)：',img2.shape)
    print('微调后的边框大小：',img2.shape)
    img3[left_bound:right_bound,up_bound:low_bound,:] = img2[:,:,:]
    cv2.namedWindow("eyes & mojing")
    cv2.imshow("eyes & mojing", img3)
    cv2.waitKey(0)
